﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace RobotGerchik.DataClass.BaseTransaqCalss
{

    /// <summary>
    /// Заявки
    /// Передается автоматически после установки соединения, а так же после
    /// изменения какого-либо из полей. В последнем случае передаются только
    /// изменившиеся поля. В таких сообщениях для условных заявок
    /// идентификатором является transactionid, для всех остальных – oderno.
    /// Transactionid - это идентификатор транзакции сервера Transaq, неизменность
    /// которого гарантируется внутри текущего сеанса связи с сервером. Он служит
    /// для идентификации условных заявок, а также заявок, отклоненных Биржей.
    /// После выставления заявки на биржу, ей присваивается параметр orderno -
    /// это постоянный идентификатор заявки, который не меняется вплоть до
    /// окончания биржевой торговой сессии.
    /// </summary>
    public class Order : INotifyPropertyChanged
    {
        #region Private

        private int _transactionid;
        private long _orderno;
        private int _secid;
        private string _board;
        private string _seccode;
        private string _client;
        private string _status;
        private string _buysell;
        private DateTime _time;
        private DateTime _accepttime;
        private string _brokerref;
        private int _balance;
        private double _price;
        private int _quantity;
        private int _hidden;
        private DateTime _withdrawtime;
        private string _result;

        #endregion

        #region Public
        /// <summary>
        /// идентификатор транзакции сервера Transaq
        /// </summary>
        public int Transactionid
        {
            get { return _transactionid; }
            set
            {
                if (_transactionid != value)
                {
                    _transactionid = value;
                    RaisePropertyChanged("Transactionid");
                }
            }
        }

        /// <summary>
        /// биржевой номер заявки
        /// </summary>
        public long Orderno
        {
            get { return _orderno; }
            set
            {
                if (_orderno != value)
                {
                    _orderno = value;
                    RaisePropertyChanged("Orderno");
                }
            }
        }

        /// <summary>
        /// идентификатор бумаги
        /// </summary>
        public int Secid
        {
            get { return _secid; }
            set
            {
                if (_secid != value)
                {
                    _secid = value;
                    RaisePropertyChanged("Secid");
                }
            }
        }

        /// <summary>
        /// идентификатор борда
        /// </summary>
        public string Board
        {
            get { return _board; }
            set
            {
                if (_board != value)
                {
                    _board = value;
                    RaisePropertyChanged("Board");
                }
            }
        }

        /// <summary>
        /// код инструмента
        /// </summary>
        public string Seccode
        {
            get { return _seccode; }
            set
            {
                if (_seccode != value)
                {
                    _seccode = value;
                    RaisePropertyChanged("Seccode");
                }
            }
        }

        /// <summary>
        /// идентификатор клиента
        /// </summary>
        public string Client
        {
            get { return _client; }
            set
            {
                if (_client != value)
                {
                    _client = value;
                    RaisePropertyChanged("Client");
                }
            }
        }
        /// <summary>
        /// статус заявки
        /// Значение status cancelled означает, что заявка находится в процессе снятия.
        /// </summary>
        public string Status
        {
            get { return _status; }
            set
            {
                if (_status != value)
                {
                    _status = value;
                    RaisePropertyChanged("Status");
                }
            }
        }
        /// <summary>
        /// покупка (B) / продажа (S)
        /// </summary>
        public string Buysell
        {
            get { return _buysell; }
            set
            {
                if (_buysell != value)
                {
                    _buysell = value;
                    RaisePropertyChanged("Buysell");
                }
            }
        }
        /// <summary>
        /// время регистрации заявки биржей
        /// </summary>
        public DateTime Time
        {
            get { return _time; }
            set
            {
                if (_time != value)
                {
                    _time = value;
                    RaisePropertyChanged("Time");
                }
            }
        }

        /// <summary>
        /// время регистрации заявки сервером Transaq (только для условных заявок)
        /// </summary>
        public DateTime Accepttime
        {
            get { return _accepttime; }
            set
            {
                if (_accepttime != value)
                {
                    _accepttime = value;
                    RaisePropertyChanged("Accepttime");
                }
            }
        }

        /// <summary>
        /// примечание
        /// </summary>
        public string Brokerref
        {
            get { return _brokerref; }
            set
            {
                if (_brokerref != value)
                {
                    _brokerref = value;
                    RaisePropertyChanged("Brokerref");
                }
            }
        }

        /// <summary>
        /// Неудовлетворенный остаток объема заявки в лотах (контрактах)
        /// </summary>
        public int Balance
        {
            get { return _balance; }
            set
            {
                if (_balance != value)
                {
                    _balance = value;
                    RaisePropertyChanged("Balance");
                }
            }
        }

        /// <summary>
        /// Цена
        /// </summary>
        public double Price
        {
            get { return _price; }
            set
            {
                if (_price != value)
                {
                    _price = value;
                    RaisePropertyChanged("Price");
                }
            }
        }

        /// <summary>
        /// Количество
        /// </summary>
        public int Quantity
        {
            get { return _quantity; }
            set
            {
                if (_quantity != value)
                {
                    _quantity = value;
                    RaisePropertyChanged("Quantity");
                }
            }
        }

        /// <summary>
        /// Скрытое количество в лотах
        /// </summary>
        public int Hidden
        {
            get { return _hidden; }
            set
            {
                if (_hidden != value)
                {
                    _hidden = value;
                    RaisePropertyChanged("Hidden");
                }
            }
        }

        /// <summary>
        /// Время снятия заявки, 0 для активных
        /// Нулевое значение элемента означает, что заявка находится в процессе снятия.
        /// Ненулевое значение withdrawtime при значении status cancelled означает, что заявка снята.
        /// </summary>
        public DateTime Withdrawtime
        {
            get { return _withdrawtime; }
            set
            {
                if (_withdrawtime != value)
                {
                    _withdrawtime = value;
                    RaisePropertyChanged("Withdrawtime");
                }
            }
        }

        /// <summary>
        /// сообщение биржи в случае отказа выставить заявку
        /// </summary>
        public string Result
        {
            get { return _result; }
            set
            {
                if (_result != value)
                {
                    _result = value;
                    RaisePropertyChanged("Result");
                }
            }
        }


        #endregion

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }
}
